/*
*
给你一个整数数组 nums 。一个子数组 [numsl, numsl+1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl + numsl+1 + ... + numsr-1 + numsr) 。

请你找出 nums 中 和的绝对值 最大的任意子数组（可能为空），并返回该 最大值 。

abs(x) 定义如下：

如果 x 是负整数，那么 abs(x) = -x 。
如果 x 是非负整数，那么 abs(x) = x 。

示例 1：

输入：nums = [1,-3,2,3,-4]
输出：5
解释：子数组 [2,3] 和的绝对值最大，为 abs(2+3) = abs(5) = 5 。
示例 2：

输入：nums = [2,-5,1,-4,3,-2]
输出：8
解释：子数组 [-5,1,-4] 和的绝对值最大，为 abs(-5+1-4) = abs(-8) = 8 。

提示：

1 <= nums.length <= 105
-104 <= nums[i] <= 104
*/
package main

import "fmt"

func main() {
	nums := []int{2, -5, 1, -4, 3, -2}
	fmt.Println(maxAbsoluteSum(nums))
}
func maxAbsoluteSum(nums []int) int {
	return V1(nums)
}

/**
 *	取最大最小子和，两个子和再取绝对值大
 */
func V1(nums []int) int {
	//	mxp = dp[i - 1]的最大, mx = 全局最大
	mxp := max(nums[0], 0)
	mx := mxp
	//	mnp = dp[i - 1]的最小，mn = 全局最小
	mnp := min(nums[0], 0)
	mn := mnp
	for i := 1; i < len(nums); i++ {
		//	取最大
		vmx := max(mxp+nums[i], nums[i], 0)
		mx = max(mx, vmx)
		mxp = vmx
		//	取最小
		vmn := min(mnp+nums[i], nums[i], 0)
		mn = min(mn, vmn)
		mnp = vmn
	}
	return max(mx, -mn)
}
